#ifndef COLLISION_H
#define COLLISION_H

#include "aabb.h"
#include "../tool/delegate.h"
#include "enveloppe.h"

class GraphicElement;

/*!
 *  \class Collision
 *  \brief  Objet utilisé pour gérer les collisions fonctionnement :
 *          On dispose d'un duo de bounding box, on vérifie si les deux rentrent en collision, si c'est le cas
 *          on exécute la méthode de l'objet passé en paramètre
 */


class AbstractCollision
{
    public:

    AbstractCollision();

    Enveloppe *a;
    Enveloppe *b;
     int state;
    virtual int CheckCollision()=0;

};

template <class T>
class Collision : public AbstractCollision
{
    public:

        int (T::*pFunc)(Enveloppe * aa, Enveloppe *bb);
        T * obj;

    Collision(Enveloppe *aA, Enveloppe* bB, int(T::*apFunc)(Enveloppe *, Enveloppe *), T * aObj);

    virtual int CheckCollision();

};


template <class T>
Collision<T>::Collision(Enveloppe * aA, Enveloppe * bB, int(T::*apFunc)(Enveloppe *, Enveloppe *), T * aobj)
{
    state=1;

    pFunc=apFunc;
    a=aA;
    b=bB;
    obj=aobj;
}

template <class T>
int Collision<T>::CheckCollision()
{
    if(a->Collide(b))
    {
        (obj->*pFunc)(a,b);
    }
}


#endif // COLLISION_H
